
package br.fafica.poo2.rightcode.usuario;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import br.fafica.poo2.rightcode.Aplicacao;
import br.fafica.poo2.rightcode.disciplina.Disciplina;
import br.fafica.poo2.rightcode.exception.UsuarioNaoEncontradoException;
import br.fafica.poo2.rightcode.exception.listaUsuarioVaziaException;
import br.fafica.poo2.rightcode.factory.ConnectionFactoryOracle;

public class RepositorioUsuarioOracle implements IRepositorioUsuario {
	
	private ConnectionFactoryOracle con;
	private Statement entrada;
	private static int increment;
	
	public RepositorioUsuarioOracle(ConnectionFactoryOracle oracle) throws SQLException{
		this.con=oracle;
		increment = (getCodigoIncrement()+1);
	}
	
	private int getCodigoIncrement() throws SQLException{
		ArrayList<Usuario> lista = null;
		Connection con=null;
		ResultSet resultado = null;
		Usuario u;

		try {
			String sql1="select * from usuario";
			con = this.con.getConexao();
			con.setAutoCommit(false);
			entrada = con.createStatement();
			
			resultado = entrada.executeQuery(sql1);
			con.commit();
			con.setAutoCommit(true);
			lista= new ArrayList<Usuario>();
		    while ( resultado.next() ) {
		    	u = new Usuario(resultado.getInt("codigo_usuario"),resultado.getString("nome_usuario"));
		    	
		    	lista.add(u);
		    }
		}catch(Exception e){
			con.rollback();	
		}finally{
			resultado.close();
			entrada.close();
			con.close();
		}
		return lista.size();
	}

	@Override
	public void TesteUsuario() throws SQLException {
		Connection con=null;

		//try {
			con = this.con.getConexao();
			System.out.println("Conexão aberta. testes temporario");//Excluir esse testes depois pois a exibi��o n�o pode ser aqui
			
		//} catch (SQLException e) {
		//	throw new SQLException();
		//}finally{
			con.close();
		//}
		
	}

	@Override
	public void InstalarUsuario(boolean samples) throws SQLException {
		Connection con = null;
		try {
		    String sql1 = "create table usuario" +
	                   "(codigo_usuario number(5) primary key ," +
	                   "nome_usuario varchar2(100) not null)";
		   /* String sql2 = "create table usuario_possue_disciplinas" +
	                   "(codigo_usuario number(5) not null  ," +
	                   "codigo_disciplina number(5) not null ," +
	                   "primary key (codigo_usuario,codigo_disciplina) ," +
	                   "foreign key (codigo_usuario) references usuario(codigo_usuario) ," +
	                   "foreign key (codigo_disciplina) references disciplina(codigo_disciplina))";*/
		    			
			con = this.con.getConexao();
			entrada = con.createStatement();
		    entrada.execute(sql1);
		    con.commit();
			con.setAutoCommit(true);
		  /*  con = this.con.getConexao();
			entrada = con.createStatement();
		    entrada.execute(sql2);
		    */
			/*String sql = "DROP TABLE usuario;";
			retornoOracle.executeUpdate(sql);*/
		}catch(Exception e){
			con.rollback();	
		}finally{
		    entrada.close();
			con.close();
		}
		
		if(samples){
			Aplicacao app = new Aplicacao();
			for(Usuario u: app.getUsuario()){
				AdicionarUsuario(u);
			}
		}
		
	}

	@Override
	public void AdicionarUsuario(Usuario usuario) throws SQLException {
		Connection con = null;
		
		if(usuario.getCodigo()==0){
			usuario.setCodigo(increment);
			increment+=1;
		}

		try {
			con = this.con.getConexao();
		    String sql = "insert into usuario (codigo_usuario, nome_usuario) values (" +
		                   usuario.getCodigo() + ", " +
		                   "'" + usuario.getNome()+"')"; 
			entrada = con.createStatement();
			entrada.executeUpdate(sql);
			con.commit();
			con.setAutoCommit(true);
			//Adicionando na rela��o usuarios_possuem_disciplinas
			/*if(!usuario.getDisciplinas().isEmpty()){
				for(Disciplina d : usuario.getDisciplinas()){
					setUsuarioPossuemDisciplinas(usuario.getCodigo(),d);
				}
			}*/
			
			System.out.println("Usuario inserido na tabela"); // linha Temporaria
		}catch(Exception e){
			con.rollback();	
		}finally {
			entrada.close();
			con.close();
		}
		
	}
	
	/*private void setUsuarioPossuemDisciplinas(int codigo_usuario ,Disciplina disciplina) throws SQLException{
		Connection con = null;
		try {
			con = this.con.getConexao();
		    String sql = "insert into usuario_possue_disciplinas (codigo_usuario, codigo_disciplina) values (" +
		    				codigo_usuario+ ", " +
		                   disciplina.getCodigo()+")"; 
			entrada = con.createStatement();
			entrada.executeUpdate(sql);
			System.out.println("usuario_possue_disciplinas inserido na tabela"); // linha Temporaria
		} finally {
			entrada.close();
			con.close();
		}
	}
*/
	@Override
	public ArrayList<Usuario> ListaUsuario() throws SQLException, listaUsuarioVaziaException {
		ArrayList<Usuario> lista = null;
		Connection con=null;
		ResultSet resultado = null;
		Usuario u;

		try {
			String sql1="select * from usuario";
			con = this.con.getConexao();
			con.setAutoCommit(false);
			entrada = con.createStatement();
			
			resultado = entrada.executeQuery(sql1);
			con.commit();
			con.setAutoCommit(true);
			lista= new ArrayList<Usuario>();
		    while ( resultado.next() ) {
		    	u = new Usuario(resultado.getInt("codigo_usuario"),resultado.getString("nome_usuario"));
		    	
		    	lista.add(u);
		    }
		}catch(Exception e){
			con.rollback();	
		}finally{
			resultado.close();
			entrada.close();
			con.close();
		}
		if(lista.isEmpty()){
			throw new listaUsuarioVaziaException();
		}else{
			return lista; //Criar uma exception Lista Vazia
		}
	}

	@Override
	public void RemoverUsuario(Usuario usuario) throws SQLException, UsuarioNaoEncontradoException {
		Connection con=null;
		con.setAutoCommit(false);
		try {
			con = this.con.getConexao();
		    String sql = "delete from usuario where codigo_usuario=" +
		                   usuario.getCodigo();
		    //LEMBRETE.: Verificar alguma maneira para se deletar o usuario deletado da tabela usuarios_possuem_disciplinas
			entrada = con.createStatement();
			entrada.executeUpdate(sql);
			con.commit();
			con.setAutoCommit(true);
		}catch(Exception e){
			con.rollback();	
		}finally{
			entrada.close();
			con.close();
		}
		
	}

	@Override
	public Usuario BuscarUsuario(int codigo) throws SQLException, UsuarioNaoEncontradoException {
		Connection con=null;
		ResultSet resultado = null;
		Usuario u=null;
		con.setAutoCommit(false);
		try {
			con = this.con.getConexao();
			con.setAutoCommit(false);
			entrada = con.createStatement();
			
			resultado = entrada.executeQuery( "select * from usuario where codigo_usuario=" + codigo);
			con.commit();
			con.setAutoCommit(true);
			//LEMBRETE. Organizar para retornar as disciplinas tambem
		    while ( resultado.next() ) {
		    	u = new Usuario(resultado.getInt("codigo_usuario"),resultado.getString("nome_usuario"));
		    }
		}catch(Exception e){
			con.rollback();	
		}finally{
			resultado.close();
			entrada.close();
			con.close();
		}
		if(u==null){
			throw new UsuarioNaoEncontradoException();
		}else{
			return u;
		}
	}

	@Override
	public void EditarUsuario(Usuario usuario)
			throws UsuarioNaoEncontradoException, SQLException {
		Connection con=null;

		try {
			con = this.con.getConexao();
			con.setAutoCommit(false);
			entrada = con.createStatement();

		    String sql = "update usuario SET " +
		    				"nome_usuario='" + usuario.getNome() + "'" +
		    				"WHERE codigo_usuario=" + usuario.getCodigo(); 
			entrada.executeUpdate(sql);
			con.commit();
			con.setAutoCommit(true);
		    
		}catch(Exception e){
			con.rollback();	
		}finally{
			entrada.close();
			con.close();
		}
		
	}
	
	

	/*Connection conexao = new Conexao().getConexao();
	@Override
	
	public void InstalarUsuario(boolean samples){
		
	}
	
	
	public void AdcionarUsuario(Usuario usuario) {
		String sql = "CREATE TABLE IF NOT EXISTS Usuario("
				+ "Nome varchar(50) not null,"
				+ "Disciplina varchar(50) not null,"
				+ "PRIMARY KEY(Nome)"
				+ ");";
		String sql = "insert into Usuario"
				+"(nome,disciplina)"
				+"values(?,?)";
		
		try{
			PreparedStatement stmp = conexao.prepareStatement(sql);
			stmp.setString(1, usuario.getNome());
			
			stmp.execute();
			stmp.close();
			
			
		}catch(SQLException e){
			e.printStackTrace();
		}	
	}

	@Override
	public void RemoverUsuario(Usuario usuario) {
		String sql = "delete from usuario where nome=?";
		
		try{
			PreparedStatement stmp = conexao.prepareStatement(sql);
			stmp.setString(1, nome);
			
			stmp.execute();
			stmp.close();
		}catch(SQLException e){
			e.printStackTrace();
		}
	
	}
	
	@Override
	public ArrayList<Usuario> ListaUsuario() {
	String sql = "select * from Usuario";
			
			try{
				PreparedStatement stmp = conexao.prepareStatement(sql);
				ResultSet resultado = stmp.executeQuery();
				
				ArrayList<Usuario> lista = new ArrayList<Usuario>();
				while(resultado.next()){
					Usuario usuario = new Usuario();
					usuario.setNome(resultado.getString("nome"));
					
					lista.add(usuario);				
				}
				resultado.close();
				stmp.close();
				return lista;
			}catch(SQLException e){
				e.printStackTrace();
			}
			return null;
		}

	@Override
	public void RemoverUsuario(Usuario usuario) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void EditarUsuario(Usuario usuario) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public Usuario BuscarUsuario(int codigo) {
		// TODO Auto-generated method stub
		return null;
	}


	@Override
	public void TesteUsuario() {
		// TODO Auto-generated method stub
		
	}*/

}
